from tkinter import *
import sqlite3
import tkinter.messagebox as messagebox
from PIL import Image,ImageTk
from Garbage_Classification_GUI import GarbageClassification


class LoginPage:
  """登录界面"""
  def __init__(self, master):
    self.root = master
    self.root.geometry('500x280+300+200')
    self.root.title('登陆')
    self.conn = sqlite3.connect('database/login.db')       #连接数据库，创建数据库对象conn
    self.username = StringVar()
    self.password = StringVar()
    self.page = Frame(self.root)
    self.creatapage()


  def creatapage(self):
    """登陆界面布局"""
    #登陆界面设计，共 5列 6行
    Label(self.page,text='蚌埠市龙子湖小区垃圾分类系统',font=("华文行楷",20,'')).grid(row=0,rowspan=2,columnspan=5,sticky='nsew',pady=15)
    
    #左边的图片界面
    image=Image.open('image/大白.jpg')
    image1=image.resize((195,170))
    img=ImageTk.PhotoImage(image1)
    self.lab_img=Label(self.page,image=img)
    self.lab_img.image=img                 #特别注意，要对显示图片的控件的image属性重新赋值，否则无法显示
    self.lab_img.grid(row=2,column=0,rowspan=4,columnspan=2,sticky='nsew',pady=10)

    #右边的登陆界面
    Label(self.page, text='用户名:').grid(row=2,column=3,sticky=W, pady=10)
    Entry(self.page, textvariable=self.username,width=22).grid(row=2, column=4, sticky=E)

    Label(self.page, text='密码:').grid(row=3,column=3,sticky=W, pady=10)
    Entry(self.page, textvariable=self.password,width=22,show='*').grid(row=3,column=4,sticky=E)

    Button(self.page, text='登录', command=self.login,fg='white',bg='blue').grid(row=4,column=3,columnspan=2,sticky='ewsn',pady=10)

    Button(self.page, text='注册账号',fg='blue', command=self.register).grid(row=5,column=3,sticky=W, pady=10)
    Button(self.page,text='忘记密码',fg='blue',command=self.ForgetPsd).grid(row=5,column=4,sticky=E)

    self.page.columnconfigure(0,minsize=95)
    self.page.columnconfigure(1,minsize=95)
    self.page.columnconfigure(2,minsize=30)        #第三列，又来控制左右两边界面的间隔大小

    self.page.pack()
  
  def ForgetPsd(self):
    messagebox.showwarning('忘记密码！','密码都能忘记，你还上什么大学？')


  def login(self):
    """登录功能"""
    curs = self.conn.cursor()     #创建游标对象curs
    query = "select username, password, loginerror from loginuser where username='%s'" % self.username.get()
    curs.execute(query) # 返回一个迭代器
    c = curs.fetchall() # 接收全部信息
    if len(c) == 0:
      messagebox.showerror('登录失败', '账户不存在')
    else:
      us, pw, lerror = c[0]
      if lerror >= 3:
        messagebox.showwarning('登录失败', '账户已被锁定')
      elif us == self.username.get() and pw == self.password.get():
        self.conn.close()                                       #关闭数据库连接
        messagebox.showinfo('登录成功', '欢迎你，%s' % us)

        self.page.destroy()                                     #登陆密码正确，进入主程序页面
        GarbageClassification(self.root)
        
      else:
        messagebox.showwarning('登录失败', '密码错误')


  def register(self):
    """注册功能跳转"""
    self.conn.close()
    self.page.destroy()           #销毁登陆界面
    RegisterPage(self.root)


class RegisterPage:
  """注册界面"""
  def __init__(self, master=None):
    self.root = master
    self.root.title('账号注册')
    self.root.geometry('400x320')
    self.conn = sqlite3.connect('database/login.db')
    self.username = StringVar()
    self.password0 = StringVar() # 第一次输入密码
    self.password1 = StringVar() # 第二次输入密码
    self.email = StringVar()
    self.page = Frame(self.root)
    self.createpage()


  def createpage(self):
    """界面布局"""
    Label(self.page).grid(row=0)

    Label(self.page, text="用户名:").grid(row=1, sticky=W, pady=10)
    Entry(self.page, textvariable=self.username).grid(row=1, column=1, sticky=E)

    Label(self.page, text="密码:").grid(row=2, sticky=W, pady=10)
    Entry(self.page, textvariable=self.password0, show='*').grid(row=2, column=1, sticky=E)

    Label(self.page, text="确认密码:").grid(row=3, sticky=W, pady=10)
    Entry(self.page, textvariable=self.password1, show='*').grid(row=3, column=1, sticky=E)

    Label(self.page, text="邮箱:").grid(row=4, sticky=W, pady=10)
    Entry(self.page, textvariable=self.email).grid(row=4, column=1, sticky=E)

    Button(self.page, text="注册", command=self.register,fg='white',bg='blue').grid(row=5, columnspan=2,sticky='nsew', pady=10)

    Label(self.page,text='已有账号？',fg='gray').grid(row=6,pady=10)
    Button(self.page, text="去登录", command=self.repage,fg='blue').grid(row=6,column=1,sticky='nsew',pady=10)    #已有账号，返回登陆界面

    self.page.pack()


  def repage(self):
    """返回登录界面"""
    self.conn.close()
    self.page.destroy()               #销毁注册界面
    LoginPage(self.root)              #调用登陆类


  def register(self):
    """注册"""
    if self.password0.get() != self.password1.get():          #密码和确认密码不同，报错
      messagebox.showwarning('错误', '密码核对错误')
    elif len(self.username.get()) == 0 or len(self.password0.get()) == 0 or len(self.email.get()) == 0:
      messagebox.showerror("错误", "所有选项均不能为空")
    else:
      curs = self.conn.cursor()               #创建一个游标对象curs
      query = 'insert into loginuser values (?,?,?,?)'
      val = [self.username.get(), self.password0.get(), self.email.get(), 0]
      try:
        curs.execute(query, val)
        self.conn.commit()
        self.conn.close()
        messagebox.showinfo("成功", "注册成功，按确定返回登录界面")
        self.page.destroy()           #销毁注册界面，返回登陆界面
        LoginPage(self.root)
      except sqlite3.IntegrityError:
        messagebox.showerror("注册失败", "该账户已存在")


